package com.bidevalution.business.function;

import java.util.*;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.util.StringUtils;

import com.bidevalution.business.context.OpType;
import com.googlecode.aviator.runtime.function.AbstractFunction;
import com.googlecode.aviator.runtime.function.FunctionUtils;
import com.googlecode.aviator.runtime.type.AviatorObject;
import com.googlecode.aviator.runtime.type.AviatorString;
import com.qtp.core.util.GsonUtil;
/**
 * 从list(map)数据中获取最前面几个的数据，如果最后一个后面跟前一个数据相同，则也继续追加
 * @author daizhifeng   
 * @date 2019年10月10日 下午9:35:02 
 * @version V2.0
 */
public class GetFrontLimitOfListFunction extends AbstractFunction{
	private FunctionInitializer functionInitializer;
	private Logger logger = LogManager.getLogger(getClass());
	public GetFrontLimitOfListFunction(FunctionInitializer functionInitializer) {
		super();
		this.functionInitializer = functionInitializer;
	}
	/**
	 * 从list(map)数据中获取最前面几个的数据，如果最后一个后面跟前一个数据相同，则也继续追加到返回结果
	 * <p>Description: </p>
	 * @param env
	 * @param arg1 list(map)值
	 * @param arg2 map中的key，表示的需要取哪个字段值的key
	 * @param arg3 取值个数 比如：如果是2,则取key对应的值最前面的两个list值，如果list第3个的key值跟第二个key值相同，则返回3个list，以此类推
	 * @return list(map)
	 * @see com.googlecode.aviator.runtime.function.AbstractFunction#call(java.util.Map, com.googlecode.aviator.runtime.type.AviatorObject, com.googlecode.aviator.runtime.type.AviatorObject, com.googlecode.aviator.runtime.type.AviatorObject)
	 */
	@Override
	public AviatorObject call(Map<String, Object> env, AviatorObject arg1, AviatorObject arg2, AviatorObject arg3) {
		String paramValue = FunctionUtils.getStringValue(arg1, env);
		List<Map<String, Object>> tempList = new ArrayList<Map<String,Object>>();
		List<String>  valueList = new ArrayList<String>();
		if(paramValue != null && paramValue.length()>0) {
			String key = arg2.getValue(env).toString();
			Integer limit = Double.valueOf(arg3.getValue(env).toString()).intValue();
			List<Map<String, Object>> dataList =  GsonUtil.jsonToListMapWithGson(paramValue);
			Collections.sort(dataList,new Comparator<Map<String, Object>>() {
				
				@Override
				public int compare(Map<String, Object> o1, Map<String, Object> o2) {
					logger.info("**********"+key+"**********"+o1+"*********************");
					return Double.valueOf(o1.get(key).toString()).compareTo(Double.valueOf(o2.get(key).toString()));
				}
			});
			logger.info("getFrontLimitOfList:"+dataList);
			for(int i = 0;i<dataList.size();i++) {
				if(i<limit) {
					//取最前面几个对象
					tempList.add(dataList.get(i));
					valueList.add(String.valueOf(dataList.get(i).get(key)));
				}else {
					//如果超过范围的对象，则判断超过范围的对象值是否和最后一个值相同，相同在追加
					if(valueList.contains(String.valueOf(dataList.get(i).get(key)))){
						tempList.add(dataList.get(i));
					}else {
						break;
					}
				}
			}
		}
		return new AviatorString(GsonUtil.toJson(tempList));
	}
	@Override
	public String getName() {
		return "getFrontLimitOfList";
	}
	
}
